Curso de ScriptVox Intermedirio - Aula 12 - Prof. Oswaldo Vernet - iNCE/UFRJ

Vamos apresentar, nesta aula, mais uma novidade da verso 6.0 do ScriptVox: 
as variveis compartimentadas.

Uma varivel compartimentada, como o prprio nome sugere,  uma varivel dividida em compartimentos, 
de modo que ela  capaz de armazenar mltiplos dados, um em cada compartimento. Os compartimentos 
de uma varivel tm nomes e a regra para formar estes nomes  a mesma regra usada para formar nomes 
e variveis, vista na primeira aula.

Vejamos, ento, como criar e manipular variveis compartimentadas em ScriptVox. Depois, 
examinaremos como construir uma lista com este tipo de varivel.

Vamos usar como analogia uma casa dividida em diversos cmodos. Desejamos armazenar,
para cada cmodo, sua rea em metros quadrados. A casa ser a nossa varivel compartimentada
e cada cmodo ser um compartimento.

Para que o interpretador fique sabendo que determinada varivel possuir compartimentos,
devemos inicializ-la da seguinte forma:

casa := {}

Com esta atribuio, informamos ao ScriptVox que "casa" ser uma varivel compartimentada.
Em nossa analogia, isto equivaleria a construir uma casa apenas com as paredes externas,
sem as divises internas ainda.

Para agregar um compartimento a uma varivel compartimentada, usamos o nome da varivel
seguido do operador PONTO seguido do nome do compartimento. Assim, podemos acrescentar 
nossa casa o compartimento "sala", usando a seguinte construo:

casa.sala := 30

O que fizemos com esta atribuio? A varivel "casa", inicializada sem compartimentos,
ganha seu primeiro compartimento, chamado "sala", que vai armazenar o valor inteiro 30.
O valor atribudo poderia ser de qualquer um dos tipos suportados pela linguagem (inteiro,
cadeia, lista, etc...). Armazenamos o nmero inteiro 30, querendo dizer com isso que a
sala da casa tem 30 metros quadrados.

Da mesma forma, podemos agregar dois novos compartimentos  casa:

casa.cozinha := 20
casa.banheiro := 15

Suponhamos que nossa casa tenha 3 quartos. Poderamos criar trs compartimentos, chamados
"quarto1", "quarto2" e "quarto3", assim:

casa.quarto1 := 10
casa.quarto2 := 12
casa.quarto3 := 9

Ou, pensando melhor, poderamos criar um nico compartimento que fosse uma lista de quartos,
atravs das atribuies:

casa.quartos := []
casa.quartos[] := 10
casa.quartos[] := 12
casa.quartos[] := 9

A primeira atribuio inicializa o compartimento "casa.quartos" com a lista vazia;
as demais, vo anexando elementos  lista: casa.quartos[0] significa que a varivel
casa tem um compartimento quartos que, por sua vez,  uma lista; nesta lista, o
primeiro elemento (o da posio zero) recebe o valor 10, significando um primeiro
quarto de 10 metros quadrados. O mesmo acontece para o segundo e terceiro quartos.

 claro que poderamos conseguir o mesmo efeito utilizando variveis separadas para
a sala, a cozinha, o banheiro e a lista de quartos. Neste exemplo simples, parece
no haver muita vantagem em tratar os diversos cmodos como compartimentos de uma
nica varivel.

Imagine, ento, que desejamos construir uma vila de dez casas, cada uma delas contendo,
inicialmente, os mesmos cmodos da casa que acabamos de criar, exatamente com as mesmas 
metragens quadradas. Conhecendo listas,  razovel que pensemos em construir uma lista 
com 10 elementos, onde cada elemento  uma casa. Cada uma das casas , por sua vez,
uma varivel compartimentada, cujos compartimentos correspondem a cmodos. Vamos criar
esta estrutura, passo a passo. Comeamos por inicializar a vila como uma lista vazia:

vila := []

Agora, anexamos 10 elementos  vila, que, inicialmente, sero casas vazias, sem cmodos:

vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  

Pensando melhor, poderamos reduzir estas 10 linhas do script usando o comando REPETE:

repete n 10
	vila[] := {}
fim repete

Muito bem. O que temos at agora? Uma lista denominada "vila", com dez elementos, comeando
na posio 0 e indo at a posio 9. Cada elemento  uma varivel compartimentada vazia, 
ainda sem compartimentos. 

Como as 10 casas tero, inicialmente, os mesmos cmodos, podemos completar a inicializao
da seguinte maneira:

vila := []
repete n 10
	casa := {}
	casa.sala := 30
	casa.cozinha := 20
	casa.banheiro := 15
	casa.quartos := []
	casa.quartos[] := 10
	casa.quartos[] := 12
	casa.quartos[] := 9
	vila[] := casa
fim repete

Para facilitar o raciocnio, em vez de trabalharmos diretamente com a varivel "vila",
em cada iterao, optamos por, primeiro, construir a casa, agregando compartimentos  varivel 
"casa" e, s depois de pronta, anexamos a casa  vila, na ltima linha do bloco do comando
REPETE.

Se, agora, o proprietrio da terceira casa resolver aumentar o banheiro para 20 metros
quadrados, como faramos esta atribuio?

Lembrando que a primeira casa est na posio zero da lista "vila", a terceira casa  a 
casa na posio 2. Portanto, qualquer modificao na terceira casa deve referir-se ao 
elemento vila[2]. Este elemento (como todos os demais)  uma varivel compartimentada, 
sendo "banheiro" um de seus compartimentos. Basta, ento, atribuirmos:

vila[2].banheiro := 20

para refletir, na estrutura, a mudana feita pelo proprietrio.

Agora, o proprietrio da quinta casa resolve fazer um "puxadinho": acrescentar um quarto
de 13 metros quadrados, alm dos trs que j existem. 

O raciocnio  o mesmo: a quinta casa est em vila[4]. Os quartos de cada casa fazem
parte de uma lista de quartos.  na lista de quartos de vila[4] que devemos anexar o
novo quarto:

vila[4].quartos[] := 13

Com esta atribuio, anexamos um novo elemento  lista "quartos" da varivel compartimentada
vila[4]. 


EXERCCIOS

Exerccio de estudo dirigido

Certo dia, chega um fiscal da prefeitura desejando saber exatamente quantos metros
quadrados de rea construda havia na vila de casas. O programador responsvel pelo
script responde sorridente com o seguinte cdigo: 

area_total := 0
para casa em vila faa
	rea_desta_casa := casa.sala + casa.cozinha + casa.banheiro
	para q em casa.quartos faa
		rea_desta_casa := rea_desta_casa + q
	fim para
	area_total := area_total + area_desta_casa
fim para

Estude o cdigo e explique o que ele fez. O comando PARA foi introduzido na oitava aula.


Exerccio de avaliao (enviar para scriptvox@gmail.com at o meio-dia de 1 de maro de 2012)

Com as variveis compartimentadas, podemos repensar a nossa agenda eletrnica. Em vez de
represent-la como duas listas separadas, podemos unificar estas duas listas em uma nica,
que ser uma lista de pessoas; cada elemento da lista (uma pessoa) tem duas informaes
associadas, ou seja, dois compartimentos: o nome e o telefone, ambos do tipo cadeia.

Modifique o script da aula 11, usando esta ideia.

Bom estudo! 

Oswaldo Vernet
